summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/uic/barcode/ssbFrame/SsbCommonTicketPart.java
blob: 8eef552a931c270a8c84696f2a5b52595deb9d13 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package org.uic.barcode.ssbFrame;

import org.uic.barcode.asn1.uper.BitBuffer;
import org.uic.barcode.asn1.uper.ByteBitBuffer;
import org.uic.barcode.ticket.EncodingFormatException;

public abstract class SsbCommonTicketPart extends SsbTicketPart {
	
	/*
	Number of adult passengers	Num (<100)	7,000
	Number of child passengers	Num (<100)	7,000
	"specimen" code	Bit Flag	1,000
	Class of travel	Lookup of 64 options	6,000
	TCN: Issuing unique Ticket number	14 AlphaNum	84,000
	Year of issue	Num (0..9)	4,000
	Issuing day, from first of January	Num (<512)	9,000
	 */
	
	protected int numberOfAdults = 0;
	protected int numberOfChildren = 0;
	protected boolean specimen = true;
	protected SsbClass classCode = null;
	protected String ticketNumber = null;
	protected int year = 0;
	protected int day = 0;
			
	protected int decodeCommonPart(byte[] bytes) {
		
		BitBuffer bits = new ByteBitBuffer(bytes);
		
		int offset = 27; // header offset
		numberOfAdults = bits.getInteger(offset, 7); 
		offset = offset + 7;
		numberOfChildren = bits.getInteger(offset, 7); 
		offset = offset + 7;
		specimen = bits.get(offset);
		offset++;
		int classIndex = bits.getInteger(offset, 6);
		classCode = SsbClass.values()[classIndex];
		offset = offset + 6;
		ticketNumber = bits.getChar6String(offset, 84);
		offset = offset + 84;
		year = bits.getInteger(offset, 4);
		offset = offset + 4;
		day = bits.getInteger(offset, 9);
		offset = offset + 9;
		return offset;
	}
	
	protected int encodeCommonPart(byte[] bytes, int offset) throws EncodingFormatException {
		
		BitBuffer bits = new ByteBitBuffer(bytes);
		
		if (numberOfAdults < 0 || numberOfAdults > 99) {
			throw new EncodingFormatException("SSB number of adults too big");
		}
		bits.putInteger(offset,7, numberOfAdults);
		offset = offset + 7;
		
		if (numberOfChildren < 0 || numberOfChildren > 99) {
			throw new EncodingFormatException("SSB number of children too big");
		}		
		bits.putInteger(offset, 7, numberOfChildren); 
		offset = offset + 7;
		
		bits.put(offset,specimen);
		offset++;
		
		bits.putInteger(offset, 6,classCode.ordinal());
		offset = offset + 6;
		
		if (ticketNumber.length() > 14) {
			throw new EncodingFormatException("SSB Ticket Number too long");
		}	
		bits.putChar6String(offset, 84, ticketNumber);
		offset = offset + 84; 
		
		
		bits.putInteger(offset, 4, (year % 10));
		offset = offset + 4;
		
		if (day > 512) {
			throw new EncodingFormatException("SSB day too long");
		}	
		bits.putInteger(offset, 9, day);
		offset = offset + 9;
		
		return offset;
		
		
	}

	public int getNumberOfAdults() {
		return numberOfAdults;
	}

	public void setNumberOfAdults(int numberOfAdults) {
		this.numberOfAdults = numberOfAdults;
	}

	public int getNumberOfChildren() {
		return numberOfChildren;
	}

	public void setNumberOfChildren(int numberOfChildren) {
		this.numberOfChildren = numberOfChildren;
	}

	public boolean isSpecimen() {
		return specimen;
	}

	public void setSpecimen(boolean specimen) {
		this.specimen = specimen;
	}

	public SsbClass getClassCode() {
		return classCode;
	}

	public void setClassCode(SsbClass classCode) {
		this.classCode = classCode;
	}

	public String getTicketNumber() {
		return ticketNumber;
	}

	public void setTicketNumber(String ticketNumber) {
		this.ticketNumber = ticketNumber;
	}

	public int getYear() {
		return year;
	}

	public void setYear(int year) {
		this.year = year;
	}

	public int getDay() {
		return day;
	}

	public void setDay(int day) {
		this.day = day;
	}

	
	
}